package com.dubbo.dubbo;

import com.dubbo.dubbo.demo.HelloServiceImp;
import com.dubbo.dubbo.demo.IHelloService;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ProtocolConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.ServiceConfig;

import java.io.IOException;

/**
 * Api方式启动
 * api的方式调用不需要其他的配置，只需要下面的代码即可。
 * 但是需要注意，官方建议：
 * Api方式用于测试用例使用，推荐xml的方式
 */
public class ApiApp {
    public static void main(String[] args) throws IOException {
        // 服务实现
        IHelloService iHelloService = new HelloServiceImp();

        // 当前应用配置
        ApplicationConfig application = new ApplicationConfig();
        application.setName("provider");
        application.setOwner("XUJK");

        // 连接注册中心配置
        RegistryConfig registry = new RegistryConfig();
        registry.setCheck(false);
        registry.setTimeout(60000);
        registry.setAddress("consul://192.168.231.132:8500");
//        registry.setUsername("aaa");
//        registry.setPassword("bbb");

        // 服务提供者协议配置
        ProtocolConfig protocol = new ProtocolConfig();
        protocol.setName("dubbo");
        protocol.setPort(20880);
        //protocol.setThreads(200);

        // 注意：ServiceConfig为重对象，内部封装了与注册中心的连接，以及开启服务端口

        // 服务提供者暴露服务配置
        ServiceConfig<IHelloService> service = new ServiceConfig<IHelloService>(); // 此实例很重，封装了与注册中心的连接，请自行缓存，否则可能造成内存和连接泄漏
        service.setApplication(application);
        service.setRegistry(registry); // 多个注册中心可以用setRegistries()
        service.setProtocol(protocol); // 多个协议可以用setProtocols()
        service.setInterface(IHelloService.class);
        service.setRef(iHelloService);
        service.setVersion("1.0.0");

        // 暴露及注册服务
        service.export();
        System.in.read(); // 按任意键退出
    }
}
